﻿#region << 版 本 注 释 >>
/*----------------------------------------------------------------
 * 创建者：王明亮
 * 创建时间：2023/8/10 8:55:39
 * 版本：V1.0.0
 * 描述：
 *
 * ----------------------------------------------------------------
 * 修改人：
 * 时间：
 * 修改说明：
 *
 * 版本：V1.0.1
 *----------------------------------------------------------------*/
#endregion << 版 本 注 释 >>
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.Filters;
using Microsoft.Extensions.Caching.Memory;
using System;

namespace MyWebApp.Filter
{

    /// <summary>
    /// 资源过滤器
    /// </summary>
    public class MyResourceFilter : Attribute, IResourceFilter//过滤器要继承Attribute 特性，这样我们才可以当做特性使用
    {
        /// <summary>
        /// 内存缓存对象
        /// </summary>
        private readonly IMemoryCache _memoryCache;
        /// <summary>
        /// 构造注入
        /// </summary>
        public MyResourceFilter(IMemoryCache memoryCache)
        {
            _memoryCache = memoryCache;
        }
        /// <summary>
        /// 资源过滤器过滤器执行之前（befor）
        /// </summary>
        /// <param name="context"></param>
        public void OnResourceExecuted(ResourceExecutedContext context)
        {
            //针对哪些Action，也可以吧特性标注在Action上
            var ad = context.ActionDescriptor;
            var str = ad.RouteValues["controller"] + "/" + ad.RouteValues["action"];
            if (str!= "ResourceFilter/Test")
            {
                return;
            }
            //我们可以将当前的结果context.Result缓存起来，当执行ing时，直接返回，为了方便示例演示，我们用时间表示。
            string content = "Action第一次执行调用时间：" + DateTime.Now;
            var value = _memoryCache.Get("key"); //判断内存中是否有内容，有就直接返回，不再执行action过程。
            if (value == null)
            {
                _memoryCache.Set("key", content);
            }
        }
        /// <summary>
        /// 资源过滤器过滤器执行之后（after）
        /// </summary>
        /// <param name="context"></param>
        public void OnResourceExecuting(ResourceExecutingContext context)
        {
            //针对哪些Action，也可以吧特性标注在Action上
            var ad = context.ActionDescriptor;
            var str = ad.RouteValues["controller"] + "/" + ad.RouteValues["action"];
            if (str != "ResourceFilter/Test")
            {
                return;
            }
            var content = _memoryCache.Get("key"); //判断内存中是否有内容，有就直接返回，不再执行action过程。
            if (content != null)
            {
               var result = new { IsSuccess = true, Msg = _memoryCache.Get("key") };
                //短路返回，不会再执行Action中方法和OnResourceExecuted方法
                context.Result = new ContentResult() { Content = Newtonsoft.Json.JsonConvert.SerializeObject(result) };
            };
            }
        }
 
}
